package com.lin.manager.file.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.lin.manager.common.ex.BizException;
import com.lin.manager.common.req.QueryPage;
import com.lin.manager.common.utils.PageUtil;
import com.lin.manager.file.dao.FileConfigDao;
import com.lin.manager.file.entity.FileConfigEntity;
import com.lin.manager.file.service.FileConfigService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * @作者: 林江
 * @创建时间: 2024/3/22
 * @功能:
 */
@Service
@Transactional
public class FileConfigServiceImpl implements FileConfigService {
    @Autowired
    private FileConfigDao fileConfigDao;

    // 初始化对象存储参数
    Map<String, FileConfigEntity> fileConfigs = new ConcurrentHashMap<>();

    @Override
    public PageUtil listByPage(QueryPage page) {
        LambdaQueryWrapper<FileConfigEntity> wrapper = new LambdaQueryWrapper<>();
        if (StringUtils.isNotBlank(page.getKey())) {
            wrapper.eq(FileConfigEntity::getPlatform, page.getKey());
        }
        Page<FileConfigEntity> selectPage = fileConfigDao.selectPage(new Page<>(page.getPageNum(), page.getPageSize()), wrapper);
        return new PageUtil(selectPage);
    }

    @Override
    public List<FileConfigEntity> list() {
        LambdaQueryWrapper<FileConfigEntity> wrapper = new LambdaQueryWrapper<>();
        return fileConfigDao.selectList(wrapper);
    }

    @Override
    public void add(FileConfigEntity fileConfig) {
        // 校验配置
        check(fileConfig.getId(), fileConfig.getPlatform());
        fileConfig.setStatus(0);
        fileConfigDao.insert(fileConfig);
        refreshFileConfig(fileConfig);
    }

    @Override
    public void update(FileConfigEntity fileConfig) {
        // 校验配置
        check(fileConfig.getId(), fileConfig.getPlatform());
        fileConfigDao.updateById(fileConfig);
        refreshFileConfig(fileConfig);
    }

    @Override
    public void del(Integer id) {
        FileConfigEntity fileConfig = fileConfigDao.selectById(id);
        fileConfigDao.deleteById(id);
        this.removeByFileConfigKey(fileConfig.getCode() + ":" + fileConfig.getStatus());
    }

    @Override
    public FileConfigEntity getByFileConfigKey(String fileConfigKey) {
        if (fileConfigs.containsKey(fileConfigKey)) {
            return fileConfigs.get(fileConfigKey);
        }
        return null;
    }

    @Override
    public void removeByFileConfigKey(String fileConfigKey) {
        if (fileConfigs.containsKey(fileConfigKey)) {
            fileConfigs.remove(fileConfigKey);
        }
    }

    @Override
    public List<FileConfigEntity> listByEnable() {
        List<FileConfigEntity> list = new ArrayList<>();
        for (String key : fileConfigs.keySet()) {
            if (key.endsWith(":1")) {
                list.add(fileConfigs.get(key));
            }
        }
        return list;
    }

    @Override
    public void updateStatus(Integer id, Integer status) {
        FileConfigEntity config = new FileConfigEntity();
        config.setId(id);
        config.setStatus(status);
        fileConfigDao.updateById(config);

        // 更新缓存
        FileConfigEntity fileConfig = fileConfigDao.selectById(id);
        refreshFileConfig(fileConfig);
    }


    @Override
    public void afterPropertiesSet() throws Exception {
        List<FileConfigEntity> datas = this.list();
        if (datas != null && datas.size() > 0) {
            this.putAll(datas);
        }
    }

    /**
     * 存放数据
     *
     * @param configs
     */
    public void putAll(List<FileConfigEntity> configs) {
        for (FileConfigEntity config : configs) {
            String key = config.getCode() + ":" + config.getStatus();
            fileConfigs.put(key, config);
        }
    }

    /**
     * 数据校验
     *
     * @param id
     * @param code
     */
    private void check(Integer id, String code) {
        LambdaQueryWrapper<FileConfigEntity> wrapper = new LambdaQueryWrapper<>();
        if (id != null) {
            wrapper.ne(FileConfigEntity::getId, id);
        }
        if (StringUtils.isNotBlank(code)) {
            wrapper.eq(FileConfigEntity::getCode, code);
        }

        Long count = fileConfigDao.selectCount(wrapper);
        if (count > 0) {
            throw new BizException("编码重复");
        }
    }

    /**
     * 更新缓存
     *
     * @param fileConfig
     */
    private synchronized void refreshFileConfig(FileConfigEntity fileConfig) {
        String key = fileConfig.getCode() + ":";
        for (int i = 0; i <= 1; i++) {
            this.removeByFileConfigKey(key + i);
        }
        fileConfigs.put(key + fileConfig.getStatus(), fileConfig);
    }

}
